package com.yeu.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionPool {
	private static DataSource ds;
	static{
		Context cxt;
		try {
			cxt = new InitialContext();
			Context envContext=(Context) cxt.lookup("java:/comp/env");
			ds=(DataSource) envContext.lookup("jdbc/DBPool");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Insert，Update等无返回值操作
	 * @param sql SQL语句
	 * @param params 参数
	 * @return
	 */
	public static Map<String,Boolean> executeUpdate(String sql,Object... params) {
		Map<String,Boolean> resMap=new HashMap<String, Boolean>();
		Connection conn = null;
		PreparedStatement pst = null;
		
		try {
			conn=ds.getConnection();
			pst=conn.prepareStatement(sql);
			for (int i = 1; i <= params.length; i++) {
				if(params[i-1] instanceof File){
					File file=(File)params[i-1];
					FileInputStream stream=new FileInputStream(file);
					pst.setBinaryStream(i, stream, file.length());
				}
				else
					pst.setObject(i, params[i-1]);
			}
			if(pst.executeUpdate() != 0){
				resMap.put("RESULT", true);
			}
			else{
				resMap.put("RESULT", false);
			}
		} catch (SQLException | FileNotFoundException e) {
			e.printStackTrace();
			resMap.put("RESULT", false);
		}
		
		try {
			conn.close();
			pst.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return resMap;
	}
	
	/**
	 * Select操作，返回值均为String
	 * @param sql SQL语句
	 * @param params 参数
	 * @return
	 */
	public static List<Map<String, String>> executeQuery(String sql,String... params){
		List<Map<String,String>> resultList=new ArrayList<Map<String,String>>();
		Connection conn = null;
		PreparedStatement pst = null;
		
		try {
			conn=ds.getConnection();
			pst=conn.prepareStatement(sql);
			for (int i = 1; i <= params.length; i++) {
				pst.setString(i, params[i-1]);
			}
			ResultSet rs=pst.executeQuery();
			while(rs.next()){
				Map<String,String> resultMap=new HashMap<String, String>();
				ResultSetMetaData rsmt=rs.getMetaData();
				int count=rsmt.getColumnCount();
				for (int i = 1; i <= count; i++) {
					resultMap.put(rsmt.getColumnName(i), rs.getString(i));
				}
				resultList.add(resultMap);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		try {
			conn.close();
			pst.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultList;
	}
	
	/**
	 * 结果有Stream的Select语句
	 * @param sql
	 * @param params
	 * @return
	 */
	public static List<Map<String, Object>> executeStreamQuery(String sql,String fileColumn,String... params){
		List<Map<String,Object>> resultList=new ArrayList<Map<String,Object>>();
		Connection conn = null;
		PreparedStatement pst = null;
		
		try {
			conn=ds.getConnection();
			pst=conn.prepareStatement(sql);
			for (int i = 1; i <= params.length; i++) {
				pst.setString(i, params[i-1]);
			}
			ResultSet rs=pst.executeQuery();
			while(rs.next()){
				Map<String,Object> resultMap=new HashMap<String, Object>();
				ResultSetMetaData rsmt=rs.getMetaData();
				int count=rsmt.getColumnCount();
				for (int i = 1; i <= count; i++) {
					if(rsmt.getColumnName(i).equals(fileColumn)){
						Blob blob=rs.getBlob(i);
						resultMap.put(rsmt.getColumnName(i), blob.getBinaryStream(1, blob.length()));
					}
					else
						resultMap.put(rsmt.getColumnName(i), rs.getString(i));
				}
				resultList.add(resultMap);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		try {
			conn.close();
			pst.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return resultList;
	}
}

//
//package com.yeu.util;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.sql.Blob;
//import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.ResultSetMetaData;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import javax.naming.Context;
//import javax.naming.InitialContext;
//import javax.naming.NamingException;
//import javax.sql.DataSource;
//
//public class ConnectionPool {
//	private static DataSource ds;
//	static{
//		Context cxt;
//		try {
//			cxt = new InitialContext();
//			Context envContext=(Context) cxt.lookup("java:/comp/env");
//			ds=(DataSource) envContext.lookup("jdbc/DBPool");
//		} catch (NamingException e) {
//			e.printStackTrace();
//		}
//	}
//	
//	/**
//	 * Insert��Update���޷���ֵ����
//	 * @param sql SQL���
//	 * @param params ����
//	 * @return
//	 */
//	public static Map<String,Boolean> executeUpdate(String sql,Object... params) {
//		Map<String,Boolean> resMap=new HashMap<String, Boolean>();
//		Connection conn = null;
//		PreparedStatement pst = null;
//		
//		try {
//			conn=ds.getConnection();
//			pst=conn.prepareStatement(sql);
//			for (int i = 1; i <= params.length; i++) {
//				if(params[i-1] instanceof File){
//					File file=(File)params[i-1];
//					FileInputStream stream=new FileInputStream(file);
//					pst.setBinaryStream(i, stream, file.length());
//				}
//				else
//					pst.setObject(i, params[i-1]);
//			}
//			if(pst.executeUpdate() != 0){
//				resMap.put("RESULT", true);
//			}
//			else{
//				resMap.put("RESULT", false);
//			}
//		} catch (SQLException | FileNotFoundException e) {
//			e.printStackTrace();
//			resMap.put("RESULT", false);
//		}
//		
//		try {
//			conn.close();
//			pst.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return resMap;
//	}
//	
//	/**
//	 * Select����������ֵ��ΪString
//	 * @param sql SQL���
//	 * @param params ����
//	 * @return
//	 */
//	public static List<Map<String, String>> executeQuery(String sql,String... params){
//		List<Map<String,String>> resultList=new ArrayList<Map<String,String>>();
//		Connection conn = null;
//		PreparedStatement pst = null;
//		
//		try {
//			conn=ds.getConnection();
//			pst=conn.prepareStatement(sql);
//			for (int i = 1; i <= params.length; i++) {
//				pst.setString(i, params[i-1]);
//			}
//			ResultSet rs=pst.executeQuery();
//			while(rs.next()){
//				Map<String,String> resultMap=new HashMap<String, String>();
//				ResultSetMetaData rsmt=rs.getMetaData();
//				int count=rsmt.getColumnCount();
//				for (int i = 1; i <= count; i++) {
//					resultMap.put(rsmt.getColumnName(i), rs.getString(i));
//				}
//				resultList.add(resultMap);
//			}
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		
//		try {
//			conn.close();
//			pst.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		
//		return resultList;
//	}
//	
//	/**
//	 * �����Stream��Select���
//	 * @param sql
//	 * @param params
//	 * @return
//	 */
//	public static List<Map<String, Object>> executeStreamQuery(String sql,String fileColumn,String... params){
//		List<Map<String,Object>> resultList=new ArrayList<Map<String,Object>>();
//		Connection conn = null;
//		PreparedStatement pst = null;
//		
//		try {
//			conn=ds.getConnection();
//			pst=conn.prepareStatement(sql);
//			for (int i = 1; i <= params.length; i++) {
//				pst.setString(i, params[i-1]);
//			}
//			ResultSet rs=pst.executeQuery();
//			while(rs.next()){
//				Map<String,Object> resultMap=new HashMap<String, Object>();
//				ResultSetMetaData rsmt=rs.getMetaData();
//				int count=rsmt.getColumnCount();
//				for (int i = 1; i <= count; i++) {
//					if(rsmt.getColumnName(i).equals(fileColumn)){
//						Blob blob=rs.getBlob(i);
//						resultMap.put(rsmt.getColumnName(i), blob.getBinaryStream(1, blob.length()));
//					}
//					else
//						resultMap.put(rsmt.getColumnName(i), rs.getString(i));
//				}
//				resultList.add(resultMap);
//			}
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		
//		try {
//			conn.close();
//			pst.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		
//		return resultList;
//	}
//}
//

